home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / linux / rtnetlink.h < prev    next >
C/C++ Source or Header  |  2005-10-13  |  20KB  |  836 lines

  1. #ifndef __LINUX_RTNETLINK_H
  2. #define __LINUX_RTNETLINK_H
  3.  
  4. #include <linux/netlink.h>
  5.  
  6. /****
  7.  *        Routing/neighbour discovery messages.
  8.  ****/
  9.  
  10. /* Types of messages */
  11.  
  12. enum {
  13.     RTM_BASE    = 16,
  14. #define RTM_BASE    RTM_BASE
  15.  
  16.     RTM_NEWLINK    = 16,
  17. #define RTM_NEWLINK    RTM_NEWLINK
  18.     RTM_DELLINK,
  19. #define RTM_DELLINK    RTM_DELLINK
  20.     RTM_GETLINK,
  21. #define RTM_GETLINK    RTM_GETLINK
  22.     RTM_SETLINK,
  23. #define RTM_SETLINK    RTM_SETLINK
  24.  
  25.     RTM_NEWADDR    = 20,
  26. #define RTM_NEWADDR    RTM_NEWADDR
  27.     RTM_DELADDR,
  28. #define RTM_DELADDR    RTM_DELADDR
  29.     RTM_GETADDR,
  30. #define RTM_GETADDR    RTM_GETADDR
  31.  
  32.     RTM_NEWROUTE    = 24,
  33. #define RTM_NEWROUTE    RTM_NEWROUTE
  34.     RTM_DELROUTE,
  35. #define RTM_DELROUTE    RTM_DELROUTE
  36.     RTM_GETROUTE,
  37. #define RTM_GETROUTE    RTM_GETROUTE
  38.  
  39.     RTM_NEWNEIGH    = 28,
  40. #define RTM_NEWNEIGH    RTM_NEWNEIGH
  41.     RTM_DELNEIGH,
  42. #define RTM_DELNEIGH    RTM_DELNEIGH
  43.     RTM_GETNEIGH,
  44. #define RTM_GETNEIGH    RTM_GETNEIGH
  45.  
  46.     RTM_NEWRULE    = 32,
  47. #define RTM_NEWRULE    RTM_NEWRULE
  48.     RTM_DELRULE,
  49. #define RTM_DELRULE    RTM_DELRULE
  50.     RTM_GETRULE,
  51. #define RTM_GETRULE    RTM_GETRULE
  52.  
  53.     RTM_NEWQDISC    = 36,
  54. #define RTM_NEWQDISC    RTM_NEWQDISC
  55.     RTM_DELQDISC,
  56. #define RTM_DELQDISC    RTM_DELQDISC
  57.     RTM_GETQDISC,
  58. #define RTM_GETQDISC    RTM_GETQDISC
  59.  
  60.     RTM_NEWTCLASS    = 40,
  61. #define RTM_NEWTCLASS    RTM_NEWTCLASS
  62.     RTM_DELTCLASS,
  63. #define RTM_DELTCLASS    RTM_DELTCLASS
  64.     RTM_GETTCLASS,
  65. #define RTM_GETTCLASS    RTM_GETTCLASS
  66.  
  67.     RTM_NEWTFILTER    = 44,
  68. #define RTM_NEWTFILTER    RTM_NEWTFILTER
  69.     RTM_DELTFILTER,
  70. #define RTM_DELTFILTER    RTM_DELTFILTER
  71.     RTM_GETTFILTER,
  72. #define RTM_GETTFILTER    RTM_GETTFILTER
  73.  
  74.     RTM_NEWACTION    = 48,
  75. #define RTM_NEWACTION   RTM_NEWACTION
  76.     RTM_DELACTION,
  77. #define RTM_DELACTION   RTM_DELACTION
  78.     RTM_GETACTION,
  79. #define RTM_GETACTION   RTM_GETACTION
  80.  
  81.     RTM_NEWPREFIX    = 52,
  82. #define RTM_NEWPREFIX    RTM_NEWPREFIX
  83.     RTM_GETPREFIX    = 54,
  84. #define RTM_GETPREFIX    RTM_GETPREFIX
  85.  
  86.     RTM_GETMULTICAST = 58,
  87. #define RTM_GETMULTICAST RTM_GETMULTICAST
  88.  
  89.     RTM_GETANYCAST    = 62,
  90. #define RTM_GETANYCAST    RTM_GETANYCAST
  91.  
  92.     RTM_MAX,
  93. #define RTM_MAX        RTM_MAX
  94. };
  95.  
  96. /* 
  97.    Generic structure for encapsulation of optional route information.
  98.    It is reminiscent of sockaddr, but with sa_family replaced
  99.    with attribute type.
  100.  */
  101.  
  102. struct rtattr
  103. {
  104.     unsigned short    rta_len;
  105.     unsigned short    rta_type;
  106. };
  107.  
  108. /* Macros to handle rtattributes */
  109.  
  110. #define RTA_ALIGNTO    4
  111. #define RTA_ALIGN(len) ( ((len)+RTA_ALIGNTO-1) & ~(RTA_ALIGNTO-1) )
  112. #define RTA_OK(rta,len) ((len) >= (int)sizeof(struct rtattr) && \
  113.              (rta)->rta_len >= sizeof(struct rtattr) && \
  114.              (rta)->rta_len <= (len))
  115. #define RTA_NEXT(rta,attrlen)    ((attrlen) -= RTA_ALIGN((rta)->rta_len), \
  116.                  (struct rtattr*)(((char*)(rta)) + RTA_ALIGN((rta)->rta_len)))
  117. #define RTA_LENGTH(len)    (RTA_ALIGN(sizeof(struct rtattr)) + (len))
  118. #define RTA_SPACE(len)    RTA_ALIGN(RTA_LENGTH(len))
  119. #define RTA_DATA(rta)   ((void*)(((char*)(rta)) + RTA_LENGTH(0)))
  120. #define RTA_PAYLOAD(rta) ((int)((rta)->rta_len) - RTA_LENGTH(0))
  121.  
  122.  
  123.  
  124.  
  125. /******************************************************************************
  126.  *        Definitions used in routing table administration.
  127.  ****/
  128.  
  129. struct rtmsg
  130. {
  131.     unsigned char        rtm_family;
  132.     unsigned char        rtm_dst_len;
  133.     unsigned char        rtm_src_len;
  134.     unsigned char        rtm_tos;
  135.  
  136.     unsigned char        rtm_table;    /* Routing table id */
  137.     unsigned char        rtm_protocol;    /* Routing protocol; see below    */
  138.     unsigned char        rtm_scope;    /* See below */    
  139.     unsigned char        rtm_type;    /* See below    */
  140.  
  141.     unsigned        rtm_flags;
  142. };
  143.  
  144. /* rtm_type */
  145.  
  146. enum
  147. {
  148.     RTN_UNSPEC,
  149.     RTN_UNICAST,        /* Gateway or direct route    */
  150.     RTN_LOCAL,        /* Accept locally        */
  151.     RTN_BROADCAST,        /* Accept locally as broadcast,
  152.                    send as broadcast */
  153.     RTN_ANYCAST,        /* Accept locally as broadcast,
  154.                    but send as unicast */
  155.     RTN_MULTICAST,        /* Multicast route        */
  156.     RTN_BLACKHOLE,        /* Drop                */
  157.     RTN_UNREACHABLE,    /* Destination is unreachable   */
  158.     RTN_PROHIBIT,        /* Administratively prohibited    */
  159.     RTN_THROW,        /* Not in this table        */
  160.     RTN_NAT,        /* Translate this address    */
  161.     RTN_XRESOLVE,        /* Use external resolver    */
  162.     __RTN_MAX
  163. };
  164.  
  165. #define RTN_MAX (__RTN_MAX - 1)
  166.  
  167.  
  168. /* rtm_protocol */
  169.  
  170. #define RTPROT_UNSPEC    0
  171. #define RTPROT_REDIRECT    1    /* Route installed by ICMP redirects;
  172.                    not used by current IPv4 */
  173. #define RTPROT_KERNEL    2    /* Route installed by kernel        */
  174. #define RTPROT_BOOT    3    /* Route installed during boot        */
  175. #define RTPROT_STATIC    4    /* Route installed by administrator    */
  176.  
  177. /* Values of protocol >= RTPROT_STATIC are not interpreted by kernel;
  178.    they are just passed from user and back as is.
  179.    It will be used by hypothetical multiple routing daemons.
  180.    Note that protocol values should be standardized in order to
  181.    avoid conflicts.
  182.  */
  183.  
  184. #define RTPROT_GATED    8    /* Apparently, GateD */
  185. #define RTPROT_RA    9    /* RDISC/ND router advertisements */
  186. #define RTPROT_MRT    10    /* Merit MRT */
  187. #define RTPROT_ZEBRA    11    /* Zebra */
  188. #define RTPROT_BIRD    12    /* BIRD */
  189. #define RTPROT_DNROUTED    13    /* DECnet routing daemon */
  190. #define RTPROT_XORP    14    /* XORP */
  191.  
  192. /* rtm_scope
  193.  
  194.    Really it is not scope, but sort of distance to the destination.
  195.    NOWHERE are reserved for not existing destinations, HOST is our
  196.    local addresses, LINK are destinations, located on directly attached
  197.    link and UNIVERSE is everywhere in the Universe.
  198.  
  199.    Intermediate values are also possible f.e. interior routes
  200.    could be assigned a value between UNIVERSE and LINK.
  201. */
  202.  
  203. enum rt_scope_t
  204. {
  205.     RT_SCOPE_UNIVERSE=0,
  206. /* User defined values  */
  207.     RT_SCOPE_SITE=200,
  208.     RT_SCOPE_LINK=253,
  209.     RT_SCOPE_HOST=254,
  210.     RT_SCOPE_NOWHERE=255
  211. };
  212.  
  213. /* rtm_flags */
  214.  
  215. #define RTM_F_NOTIFY        0x100    /* Notify user of route change    */
  216. #define RTM_F_CLONED        0x200    /* This route is cloned        */
  217. #define RTM_F_EQUALIZE        0x400    /* Multipath equalizer: NI    */
  218. #define RTM_F_PREFIX        0x800    /* Prefix addresses        */
  219.  
  220. /* Reserved table identifiers */
  221.  
  222. enum rt_class_t
  223. {
  224.     RT_TABLE_UNSPEC=0,
  225. /* User defined values */
  226.     RT_TABLE_DEFAULT=253,
  227.     RT_TABLE_MAIN=254,
  228.     RT_TABLE_LOCAL=255,
  229.     __RT_TABLE_MAX
  230. };
  231. #define RT_TABLE_MAX (__RT_TABLE_MAX - 1)
  232.  
  233.  
  234.  
  235. /* Routing message attributes */
  236.  
  237. enum rtattr_type_t
  238. {
  239.     RTA_UNSPEC,
  240.     RTA_DST,
  241.     RTA_SRC,
  242.     RTA_IIF,
  243.     RTA_OIF,
  244.     RTA_GATEWAY,
  245.     RTA_PRIORITY,
  246.     RTA_PREFSRC,
  247.     RTA_METRICS,
  248.     RTA_MULTIPATH,
  249.     RTA_PROTOINFO,
  250.     RTA_FLOW,
  251.     RTA_CACHEINFO,
  252.     RTA_SESSION,
  253.     __RTA_MAX
  254. };
  255.  
  256. #define RTA_MAX (__RTA_MAX - 1)
  257.  
  258. #define RTM_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtmsg))))
  259. #define RTM_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct rtmsg))
  260.  
  261. /* RTM_MULTIPATH --- array of struct rtnexthop.
  262.  *
  263.  * "struct rtnexthop" describes all necessary nexthop information,
  264.  * i.e. parameters of path to a destination via this nexthop.
  265.  *
  266.  * At the moment it is impossible to set different prefsrc, mtu, window
  267.  * and rtt for different paths from multipath.
  268.  */
  269.  
  270. struct rtnexthop
  271. {
  272.     unsigned short        rtnh_len;
  273.     unsigned char        rtnh_flags;
  274.     unsigned char        rtnh_hops;
  275.     int            rtnh_ifindex;
  276. };
  277.  
  278. /* rtnh_flags */
  279.  
  280. #define RTNH_F_DEAD        1    /* Nexthop is dead (used by multipath)    */
  281. #define RTNH_F_PERVASIVE    2    /* Do recursive gateway lookup    */
  282. #define RTNH_F_ONLINK        4    /* Gateway is forced on link    */
  283.  
  284. /* Macros to handle hexthops */
  285.  
  286. #define RTNH_ALIGNTO    4
  287. #define RTNH_ALIGN(len) ( ((len)+RTNH_ALIGNTO-1) & ~(RTNH_ALIGNTO-1) )
  288. #define RTNH_OK(rtnh,len) ((rtnh)->rtnh_len >= sizeof(struct rtnexthop) && \
  289.                ((int)(rtnh)->rtnh_len) <= (len))
  290. #define RTNH_NEXT(rtnh)    ((struct rtnexthop*)(((char*)(rtnh)) + RTNH_ALIGN((rtnh)->rtnh_len)))
  291. #define RTNH_LENGTH(len) (RTNH_ALIGN(sizeof(struct rtnexthop)) + (len))
  292. #define RTNH_SPACE(len)    RTNH_ALIGN(RTNH_LENGTH(len))
  293. #define RTNH_DATA(rtnh)   ((struct rtattr*)(((char*)(rtnh)) + RTNH_LENGTH(0)))
  294.  
  295. /* RTM_CACHEINFO */
  296.  
  297. struct rta_cacheinfo
  298. {
  299.     __u32    rta_clntref;
  300.     __u32    rta_lastuse;
  301.     __s32    rta_expires;
  302.     __u32    rta_error;
  303.     __u32    rta_used;
  304.  
  305. #define RTNETLINK_HAVE_PEERINFO 1
  306.     __u32    rta_id;
  307.     __u32    rta_ts;
  308.     __u32    rta_tsage;
  309. };
  310.  
  311. /* RTM_METRICS --- array of struct rtattr with types of RTAX_* */
  312.  
  313. enum
  314. {
  315.     RTAX_UNSPEC,
  316. #define RTAX_UNSPEC RTAX_UNSPEC
  317.     RTAX_LOCK,
  318. #define RTAX_LOCK RTAX_LOCK
  319.     RTAX_MTU,
  320. #define RTAX_MTU RTAX_MTU
  321.     RTAX_WINDOW,
  322. #define RTAX_WINDOW RTAX_WINDOW
  323.     RTAX_RTT,
  324. #define RTAX_RTT RTAX_RTT
  325.     RTAX_RTTVAR,
  326. #define RTAX_RTTVAR RTAX_RTTVAR
  327.     RTAX_SSTHRESH,
  328. #define RTAX_SSTHRESH RTAX_SSTHRESH
  329.     RTAX_CWND,
  330. #define RTAX_CWND RTAX_CWND
  331.     RTAX_ADVMSS,
  332. #define RTAX_ADVMSS RTAX_ADVMSS
  333.     RTAX_REORDERING,
  334. #define RTAX_REORDERING RTAX_REORDERING
  335.     RTAX_HOPLIMIT,
  336. #define RTAX_HOPLIMIT RTAX_HOPLIMIT
  337.     RTAX_INITCWND,
  338. #define RTAX_INITCWND RTAX_INITCWND
  339.     RTAX_FEATURES,
  340. #define RTAX_FEATURES RTAX_FEATURES
  341.     __RTAX_MAX
  342. };
  343.  
  344. #define RTAX_MAX (__RTAX_MAX - 1)
  345.  
  346. #define RTAX_FEATURE_ECN    0x00000001
  347. #define RTAX_FEATURE_SACK    0x00000002
  348. #define RTAX_FEATURE_TIMESTAMP    0x00000004
  349.  
  350. struct rta_session
  351. {
  352.     __u8    proto;
  353.  
  354.     union {
  355.         struct {
  356.             __u16    sport;
  357.             __u16    dport;
  358.         } ports;
  359.  
  360.         struct {
  361.             __u8    type;
  362.             __u8    code;
  363.             __u16    ident;
  364.         } icmpt;
  365.  
  366.         __u32        spi;
  367.     } u;
  368. };
  369.  
  370.  
  371. /*********************************************************
  372.  *        Interface address.
  373.  ****/
  374.  
  375. struct ifaddrmsg
  376. {
  377.     unsigned char    ifa_family;
  378.     unsigned char    ifa_prefixlen;    /* The prefix length        */
  379.     unsigned char    ifa_flags;    /* Flags            */
  380.     unsigned char    ifa_scope;    /* See above            */
  381.     int        ifa_index;    /* Link index            */
  382. };
  383.  
  384. enum
  385. {
  386.     IFA_UNSPEC,
  387.     IFA_ADDRESS,
  388.     IFA_LOCAL,
  389.     IFA_LABEL,
  390.     IFA_BROADCAST,
  391.     IFA_ANYCAST,
  392.     IFA_CACHEINFO,
  393.     IFA_MULTICAST,
  394.     __IFA_MAX
  395. };
  396.  
  397. #define IFA_MAX (__IFA_MAX - 1)
  398.  
  399. /* ifa_flags */
  400.  
  401. #define IFA_F_SECONDARY        0x01
  402. #define IFA_F_TEMPORARY        IFA_F_SECONDARY
  403.  
  404. #define IFA_F_DEPRECATED    0x20
  405. #define IFA_F_TENTATIVE        0x40
  406. #define IFA_F_PERMANENT        0x80
  407.  
  408. struct ifa_cacheinfo
  409. {
  410.     __u32    ifa_prefered;
  411.     __u32    ifa_valid;
  412.     __u32    cstamp; /* created timestamp, hundredths of seconds */
  413.     __u32    tstamp; /* updated timestamp, hundredths of seconds */
  414. };
  415.  
  416.  
  417. #define IFA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))))
  418. #define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg))
  419.  
  420. /*
  421.    Important comment:
  422.    IFA_ADDRESS is prefix address, rather than local interface address.
  423.    It makes no difference for normally configured broadcast interfaces,
  424.    but for point-to-point IFA_ADDRESS is DESTINATION address,
  425.    local address is supplied in IFA_LOCAL attribute.
  426.  */
  427.  
  428. /**************************************************************
  429.  *        Neighbour discovery.
  430.  ****/
  431.  
  432. struct ndmsg
  433. {
  434.     unsigned char    ndm_family;
  435.     unsigned char    ndm_pad1;
  436.     unsigned short    ndm_pad2;
  437.     int        ndm_ifindex;    /* Link index            */
  438.     __u16        ndm_state;
  439.     __u8        ndm_flags;
  440.     __u8        ndm_type;
  441. };
  442.  
  443. enum
  444. {
  445.     NDA_UNSPEC,
  446.     NDA_DST,
  447.     NDA_LLADDR,
  448.     NDA_CACHEINFO,
  449.     __NDA_MAX
  450. };
  451.  
  452. #define NDA_MAX (__NDA_MAX - 1)
  453.  
  454. #define NDA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg))))
  455. #define NDA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndmsg))
  456.  
  457. /*
  458.  *    Neighbor Cache Entry Flags
  459.  */
  460.  
  461. #define NTF_PROXY    0x08    /* == ATF_PUBL */
  462. #define NTF_ROUTER    0x80
  463.  
  464. /*
  465.  *    Neighbor Cache Entry States.
  466.  */
  467.  
  468. #define NUD_INCOMPLETE    0x01
  469. #define NUD_REACHABLE    0x02
  470. #define NUD_STALE    0x04
  471. #define NUD_DELAY    0x08
  472. #define NUD_PROBE    0x10
  473. #define NUD_FAILED    0x20
  474.  
  475. /* Dummy states */
  476. #define NUD_NOARP    0x40
  477. #define NUD_PERMANENT    0x80
  478. #define NUD_NONE    0x00
  479.  
  480.  
  481. struct nda_cacheinfo
  482. {
  483.     __u32        ndm_confirmed;
  484.     __u32        ndm_used;
  485.     __u32        ndm_updated;
  486.     __u32        ndm_refcnt;
  487. };
  488.  
  489. /****
  490.  *        General form of address family dependent message.
  491.  ****/
  492.  
  493. struct rtgenmsg
  494. {
  495.     unsigned char        rtgen_family;
  496. };
  497.  
  498. /*****************************************************************
  499.  *        Link layer specific messages.
  500.  ****/
  501.  
  502. /* struct ifinfomsg
  503.  * passes link level specific information, not dependent
  504.  * on network protocol.
  505.  */
  506.  
  507. struct ifinfomsg
  508. {
  509.     unsigned char    ifi_family;
  510.     unsigned char    __ifi_pad;
  511.     unsigned short    ifi_type;        /* ARPHRD_* */
  512.     int        ifi_index;        /* Link index    */
  513.     unsigned    ifi_flags;        /* IFF_* flags    */
  514.     unsigned    ifi_change;        /* IFF_* change mask */
  515. };
  516.  
  517. /********************************************************************
  518.  *        prefix information 
  519.  ****/
  520.  
  521. struct prefixmsg
  522. {
  523.     unsigned char    prefix_family;
  524.     int        prefix_ifindex;
  525.     unsigned char    prefix_type;
  526.     unsigned char    prefix_len;
  527.     unsigned char    prefix_flags;
  528. };
  529.  
  530. enum 
  531. {
  532.     PREFIX_UNSPEC,
  533.     PREFIX_ADDRESS,
  534.     PREFIX_CACHEINFO,
  535.     __PREFIX_MAX
  536. };
  537.  
  538. #define PREFIX_MAX    (__PREFIX_MAX - 1)
  539.  
  540. struct prefix_cacheinfo
  541. {
  542.     __u32    preferred_time;
  543.     __u32    valid_time;
  544. };
  545.  
  546. /* The struct should be in sync with struct net_device_stats */
  547. struct rtnl_link_stats
  548. {
  549.     __u32    rx_packets;        /* total packets received    */
  550.     __u32    tx_packets;        /* total packets transmitted    */
  551.     __u32    rx_bytes;        /* total bytes received     */
  552.     __u32    tx_bytes;        /* total bytes transmitted    */
  553.     __u32    rx_errors;        /* bad packets received        */
  554.     __u32    tx_errors;        /* packet transmit problems    */
  555.     __u32    rx_dropped;        /* no space in linux buffers    */
  556.     __u32    tx_dropped;        /* no space available in linux    */
  557.     __u32    multicast;        /* multicast packets received    */
  558.     __u32    collisions;
  559.  
  560.     /* detailed rx_errors: */
  561.     __u32    rx_length_errors;
  562.     __u32    rx_over_errors;        /* receiver ring buff overflow    */
  563.     __u32    rx_crc_errors;        /* recved pkt with crc error    */
  564.     __u32    rx_frame_errors;    /* recv'd frame alignment error */
  565.     __u32    rx_fifo_errors;        /* recv'r fifo overrun        */
  566.     __u32    rx_missed_errors;    /* receiver missed packet    */
  567.  
  568.     /* detailed tx_errors */
  569.     __u32    tx_aborted_errors;
  570.     __u32    tx_carrier_errors;
  571.     __u32    tx_fifo_errors;
  572.     __u32    tx_heartbeat_errors;
  573.     __u32    tx_window_errors;
  574.     
  575.     /* for cslip etc */
  576.     __u32    rx_compressed;
  577.     __u32    tx_compressed;
  578. };
  579.  
  580. /* The struct should be in sync with struct ifmap */
  581. struct rtnl_link_ifmap
  582. {
  583.     __u64    mem_start;
  584.     __u64    mem_end;
  585.     __u64    base_addr;
  586.     __u16    irq;
  587.     __u8    dma;
  588.     __u8    port;
  589. };
  590.  
  591. enum
  592. {
  593.     IFLA_UNSPEC,
  594.     IFLA_ADDRESS,
  595.     IFLA_BROADCAST,
  596.     IFLA_IFNAME,
  597.     IFLA_MTU,
  598.     IFLA_LINK,
  599.     IFLA_QDISC,
  600.     IFLA_STATS,
  601.     IFLA_COST,
  602. #define IFLA_COST IFLA_COST
  603.     IFLA_PRIORITY,
  604. #define IFLA_PRIORITY IFLA_PRIORITY
  605.     IFLA_MASTER,
  606. #define IFLA_MASTER IFLA_MASTER
  607.     IFLA_WIRELESS,        /* Wireless Extension event - see wireless.h */
  608. #define IFLA_WIRELESS IFLA_WIRELESS
  609.     IFLA_PROTINFO,        /* Protocol specific information for a link */
  610. #define IFLA_PROTINFO IFLA_PROTINFO
  611.     IFLA_TXQLEN,
  612. #define IFLA_TXQLEN IFLA_TXQLEN
  613.     IFLA_MAP,
  614. #define IFLA_MAP IFLA_MAP
  615.     IFLA_WEIGHT,
  616. #define IFLA_WEIGHT IFLA_WEIGHT
  617.     __IFLA_MAX
  618. };
  619.  
  620.  
  621. #define IFLA_MAX (__IFLA_MAX - 1)
  622.  
  623. #define IFLA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
  624. #define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg))
  625.  
  626. /* ifi_flags.
  627.  
  628.    IFF_* flags.
  629.  
  630.    The only change is:
  631.    IFF_LOOPBACK, IFF_BROADCAST and IFF_POINTOPOINT are
  632.    more not changeable by user. They describe link media
  633.    characteristics and set by device driver.
  634.  
  635.    Comments:
  636.    - Combination IFF_BROADCAST|IFF_POINTOPOINT is invalid
  637.    - If neither of these three flags are set;
  638.      the interface is NBMA.
  639.  
  640.    - IFF_MULTICAST does not mean anything special:
  641.    multicasts can be used on all not-NBMA links.
  642.    IFF_MULTICAST means that this media uses special encapsulation
  643.    for multicast frames. Apparently, all IFF_POINTOPOINT and
  644.    IFF_BROADCAST devices are able to use multicasts too.
  645.  */
  646.  
  647. /* IFLA_LINK.
  648.    For usual devices it is equal ifi_index.
  649.    If it is a "virtual interface" (f.e. tunnel), ifi_link
  650.    can point to real physical interface (f.e. for bandwidth calculations),
  651.    or maybe 0, what means, that real media is unknown (usual
  652.    for IPIP tunnels, when route to endpoint is allowed to change)
  653.  */
  654.  
  655. /* Subtype attributes for IFLA_PROTINFO */
  656. enum
  657. {
  658.     IFLA_INET6_UNSPEC,
  659.     IFLA_INET6_FLAGS,    /* link flags            */
  660.     IFLA_INET6_CONF,    /* sysctl parameters        */
  661.     IFLA_INET6_STATS,    /* statistics            */
  662.     IFLA_INET6_MCAST,    /* MC things. What of them?    */
  663.     IFLA_INET6_CACHEINFO,    /* time values and max reasm size */
  664.     __IFLA_INET6_MAX
  665. };
  666.  
  667. #define IFLA_INET6_MAX    (__IFLA_INET6_MAX - 1)
  668.  
  669. struct ifla_cacheinfo
  670. {
  671.     __u32    max_reasm_len;
  672.     __u32    tstamp;        /* ipv6InterfaceTable updated timestamp */
  673.     __u32    reachable_time;
  674.     __u32    retrans_time;
  675. };
  676.  
  677. /*****************************************************************
  678.  *        Traffic control messages.
  679.  ****/
  680.  
  681. struct tcmsg
  682. {
  683.     unsigned char    tcm_family;
  684.     unsigned char    tcm__pad1;
  685.     unsigned short    tcm__pad2;
  686.     int        tcm_ifindex;
  687.     __u32        tcm_handle;
  688.     __u32        tcm_parent;
  689.     __u32        tcm_info;
  690. };
  691.  
  692. enum
  693. {
  694.     TCA_UNSPEC,
  695.     TCA_KIND,
  696.     TCA_OPTIONS,
  697.     TCA_STATS,
  698.     TCA_XSTATS,
  699.     TCA_RATE,
  700.     TCA_FCNT,
  701.     TCA_STATS2,
  702.     TCA_ACT_STATS,
  703.     __TCA_MAX
  704. };
  705.  
  706. #define TCA_MAX (__TCA_MAX - 1)
  707.  
  708. #define TCA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg))))
  709. #define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg))
  710.  
  711.  
  712. /* RTnetlink multicast groups */
  713.  
  714. #define RTMGRP_LINK        1
  715. #define RTMGRP_NOTIFY        2
  716. #define RTMGRP_NEIGH        4
  717. #define RTMGRP_TC        8
  718.  
  719. #define RTMGRP_IPV4_IFADDR    0x10
  720. #define RTMGRP_IPV4_MROUTE    0x20
  721. #define RTMGRP_IPV4_ROUTE    0x40
  722.  
  723. #define RTMGRP_IPV6_IFADDR    0x100
  724. #define RTMGRP_IPV6_MROUTE    0x200
  725. #define RTMGRP_IPV6_ROUTE    0x400
  726. #define RTMGRP_IPV6_IFINFO    0x800
  727.  
  728. #define RTMGRP_DECnet_IFADDR    0x1000
  729. #define RTMGRP_DECnet_ROUTE     0x4000
  730.  
  731. #define RTMGRP_IPV6_PREFIX    0x20000
  732.  
  733. /* TC action piece */
  734. struct tcamsg
  735. {
  736.     unsigned char    tca_family;
  737.     unsigned char    tca__pad1;
  738.     unsigned short    tca__pad2;
  739. };
  740. #define TA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcamsg))))
  741. #define TA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcamsg))
  742. #define TCA_ACT_TAB 1 /* attr type must be >=1 */    
  743. #define TCAA_MAX 1
  744.  
  745. /* End of information exported to user level */
  746.  
  747. #ifdef __KERNEL__
  748.  
  749. #include <linux/config.h>
  750.  
  751. extern size_t rtattr_strlcpy(char *dest, const struct rtattr *rta, size_t size);
  752. static __inline__ int rtattr_strcmp(const struct rtattr *rta, const char *str)
  753. {
  754.     int len = strlen(str) + 1;
  755.     return len > rta->rta_len || memcmp(RTA_DATA(rta), str, len);
  756. }
  757.  
  758. extern int rtattr_parse(struct rtattr *tb[], int maxattr, struct rtattr *rta, int len);
  759.  
  760. #define rtattr_parse_nested(tb, max, rta) \
  761.     rtattr_parse((tb), (max), RTA_DATA((rta)), RTA_PAYLOAD((rta)))
  762.  
  763. extern struct sock *rtnl;
  764.  
  765. struct rtnetlink_link
  766. {
  767.     int (*doit)(struct sk_buff *, struct nlmsghdr*, void *attr);
  768.     int (*dumpit)(struct sk_buff *, struct netlink_callback *cb);
  769. };
  770.  
  771. extern struct rtnetlink_link * rtnetlink_links[NPROTO];
  772. extern int rtnetlink_send(struct sk_buff *skb, u32 pid, u32 group, int echo);
  773. extern int rtnetlink_put_metrics(struct sk_buff *skb, u32 *metrics);
  774.  
  775. extern void __rta_fill(struct sk_buff *skb, int attrtype, int attrlen, const void *data);
  776.  
  777. #define RTA_PUT(skb, attrtype, attrlen, data) \
  778. ({    if (unlikely(skb_tailroom(skb) < (int)RTA_SPACE(attrlen))) \
  779.          goto rtattr_failure; \
  780.        __rta_fill(skb, attrtype, attrlen, data); }) 
  781.  
  782. static inline struct rtattr *
  783. __rta_reserve(struct sk_buff *skb, int attrtype, int attrlen)
  784. {
  785.     struct rtattr *rta;
  786.     int size = RTA_LENGTH(attrlen);
  787.  
  788.     rta = (struct rtattr*)skb_put(skb, RTA_ALIGN(size));
  789.     rta->rta_type = attrtype;
  790.     rta->rta_len = size;
  791.     return rta;
  792. }
  793.  
  794. #define __RTA_PUT(skb, attrtype, attrlen) \
  795. ({     if (unlikely(skb_tailroom(skb) < (int)RTA_SPACE(attrlen))) \
  796.         goto rtattr_failure; \
  797.        __rta_reserve(skb, attrtype, attrlen); })
  798.  
  799. extern void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change);
  800.  
  801. extern struct semaphore rtnl_sem;
  802.  
  803. #define rtnl_shlock()        down(&rtnl_sem)
  804. #define rtnl_shlock_nowait()    down_trylock(&rtnl_sem)
  805.  
  806. #define rtnl_shunlock()    do { up(&rtnl_sem); \
  807.                      if (rtnl && rtnl->sk_receive_queue.qlen) \
  808.                      rtnl->sk_data_ready(rtnl, 0); \
  809.                 } while(0)
  810.  
  811. extern void rtnl_lock(void);
  812. extern int rtnl_lock_interruptible(void);
  813. extern void rtnl_unlock(void);
  814. extern void rtnetlink_init(void);
  815.  
  816. #define ASSERT_RTNL() do { \
  817.     if (unlikely(down_trylock(&rtnl_sem) == 0)) { \
  818.         up(&rtnl_sem); \
  819.         printk(KERN_ERR "RTNL: assertion failed at %s (%d)\n", \
  820.                __FILE__,  __LINE__); \
  821.         dump_stack(); \
  822.     } \
  823. } while(0)
  824.  
  825. #define BUG_TRAP(x) do { \
  826.     if (unlikely(!(x))) { \
  827.         printk(KERN_ERR "KERNEL: assertion (%s) failed at %s (%d)\n", \
  828.             #x,  __FILE__ , __LINE__); \
  829.     } \
  830. } while(0)
  831.  
  832. #endif /* __KERNEL__ */
  833.  
  834.  
  835. #endif    /* __LINUX_RTNETLINK_H */
  836.